package br.unifor.ads.desphouse.business;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.unifor.ads.desphouse.dao.LancamentoDAO;
import br.unifor.ads.desphouse.entity.Lancamento;
import br.unifor.ads.desphouse.entity.Parcelamento;
import br.unifor.ads.desphouse.exception.BusinessException;
import br.unifor.ads.desphouse.to.LancamentoTO;

/**
 * Classe de negocio para o lancamento
 * 
 * @author Alex Girao
 */
public class LancamentoBusiness {
	
	private LancamentoDAO lancamentoDAO;
	private ParcelamentoBusiness parcelamentoBusiness;
	
	public LancamentoBusiness() {
		lancamentoDAO = new LancamentoDAO();
		parcelamentoBusiness = new ParcelamentoBusiness();
	}
	
	public List<Lancamento> buscarTodos() throws BusinessException{
		try {
			return lancamentoDAO.buscarTodos();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}
	
	public Lancamento buscarPorCodigo(Long codigo) throws BusinessException{
		try {
			return lancamentoDAO.buscarPorCodigo(codigo);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}
	
	public Lancamento salvar
		(LancamentoTO to) 
		throws BusinessException{
		try {
			Lancamento lancamento = to.getLancamento();
			if(lancamento.getCodigo()==null){
				lancamento = lancamentoDAO.salvar(lancamento);
			}else{
				lancamentoDAO.atualizar(lancamento);
			}
			realizarParcelamentoAutomatico(to);
			return to.getLancamento();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}
	
	public void excluirPorCodigo(Long codigo) throws BusinessException{
		try {
			//remove todas as parcelas de um lancamento
			parcelamentoBusiness.excluirParcelasLancamento(codigo);
			//remove o lancamento
			lancamentoDAO.excluirPorCodigo(codigo);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}
	
	/**
	 * Armazena todas as parcelas de um determinado lancamento
	 * 
	 * @param to
	 * @return
	 * @throws BusinessException
	 */
	private Lancamento realizarParcelamentoAutomatico
	(LancamentoTO to) 
	throws BusinessException{
		try{
			List<Parcelamento> parcelas = parcelamentoBusiness.emitirParcelas(to);
			to.getLancamento().setParcelas(parcelas);
			return to.getLancamento();
		} catch (Exception e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}

	//TODO criar teste
	public List<LancamentoTO> buscarPorFiltro(LancamentoTO to)
			throws BusinessException{
		// TODO Auto-generated method stub
		return new ArrayList<LancamentoTO>();
	}
	
}
